package LeetCode;

import java.lang.reflect.Array;
import java.util.Arrays;

/**
 * @author VX5
 * @Title: MJC
 * @ProjectName DataStructure
 * @Description: TODO
 * @date ${DAT}15:42
 */
public class LeetCode198II {
    public static void main(String[] args) {
        int[] arr = {1,2,3,1};
        System.out.println(new LeetCode198II().rob(arr));
    }

    public int rob(int[] nums){
        if (nums.length == 0){
            return 0;
        }else if (nums.length == 1){
            return nums[0];
        }
        // 环状排列意味着第一个房子和最后一个房子中只能选择一个偷窃，因此可以把此环状排列房间问题约化为两个单排排列房间子问题：
        //
        //在不偷窃第一个房子的情况下（即 nums[1:]nums[1:]），最大金额是 p_1p

        //在不偷窃最后一个房子的情况下（即 nums[:n-1]nums[:n−1]），最大金额是 p_2p

        //综合偷窃最大金额： 为以上两种情况的较大值，即 max(p1,p2)max(p1,p2) 。
        //下面的任务则是解决 单排排列房间（即 198. 打家劫舍） 问题。推荐可以先把 198.198. 做完再做这道题

        //这里就会分为 不要数组尾部的数字 和 要数组尾部的数字但不要首部的数字的两个单排列问题
        return Math.max(MyRob(Arrays.copyOfRange(nums,0,nums.length-1)),
                MyRob(Arrays.copyOfRange(nums,1,nums.length)));
    }

    public int MyRob(int[] nums) {
        int curMax = 0;
        int preMax = 0;
        for (int i = 0; i < nums.length; i++){
            int temp = curMax;
            curMax = Math.max(nums[i]+preMax,curMax);
            preMax = temp;
        }
        return curMax;
    }
}
